#ifndef CONFIG_H
#define CONFIG_H

#pragma once

#include "CppInterface/Serial.h"
#include "CppInterface/StateManager.h"
#include <QObject>


//串口管理类
class SerialMgr
{
public:
    SerialMgr()=default;
    //串口变量
    QString PortName{}; //串口名称
    QString BaudRate{}; //波特率
    QString DataBits{}; //数据位
    QString Control{}; //数据流
    QString StopBits{}; //停止位
    QString Parity{}; //校验位
    QStringList lastPorts_; // 保存上一次扫描到的串口列表

    // 串口状态
    bool m_serialOpened = false; // 串口是否打开

    // // 获取 SERIAL 实例
    // SERIAL* serial() const { return SERIAL::instance(); }
};

//UDP 管理类
class UdpClient
{
public:
    UdpClient()=default;
    QString RangeIP{};      //远程IP
    QString RangePort{};    //远程端口
    QString LocalPort{};    //本地端口
};

//TCP客户端 管理类
class TcpClient
{
public:
    TcpClient()=default;
};

//TCP客户端 管理类
class TcpserverClient
{
public:
    TcpserverClient()=default;
};


class Config : public QObject
{
    Q_OBJECT

public:
    explicit Config(QObject* parent = nullptr);
    ~Config() override;

    // ===================== 保存函数接口 =====================
    Q_INVOKABLE void setConnectionModes(const QString& Str);
    Q_INVOKABLE void setValue(const QString& Name, const QVariant& value);
    Q_INVOKABLE QString getStringValue(const QString& Name, const QString& defaultValue);
    Q_INVOKABLE int getIntValue(const QString& Name, int defaultValue);

    // ===================== 功能类函数接口 =====================
    void setConnectionOpened(bool opened);  //按键状态
    Q_INVOKABLE QString readConnectionModes();//读取模式状态

    Q_INVOKABLE void setEncodedMode(const QString& Str); //设置编码器格式
    QString ReadEncodedMode();  //读取编码器格式


    signals:
        void connectionOpenedChanged(bool opened);  //按钮状态true打开  false关闭

private:
    std::unique_ptr<StateManager> stateManager; //保存类
    std::unique_ptr<SerialMgr> serialMgr; //串口类
    std::unique_ptr<UdpClient> udpClient; //UDP管理类
    std::unique_ptr<TcpClient> tcpClient; //TCP客户端类管理类
    std::unique_ptr<TcpserverClient> tcpserverClient; //TCP服务器管理类

    QString ConnectionModes; //模式选择
    QString EncodedMode; //编码器格式

public:
    // ===================== 串口参数设置 =====================
    //设置接口
    Q_INVOKABLE void setPortName(const QString& Str);
    Q_INVOKABLE void setBaudRate(const QString& Str);
    Q_INVOKABLE void setDataBits(const QString& Str);
    Q_INVOKABLE void setControl(const QString& Str);
    Q_INVOKABLE void setStopBits(const QString& Str);
    Q_INVOKABLE void setParity(const QString& Str);

    //读取接口
    QString ReadPortName();
    QString ReadBaudRate();
    QString ReadDataBits();
    QString ReadControl();
    QString ReadStopBits();
    QString ReadParity();

    //功能函数

    Q_INVOKABLE QString setHexData(const QString& Str);

    bool isSerialOpened() const { return serialMgr->m_serialOpened; } //串口状态属性的接口
    void setSerialError(const QString& errorMsg);

    //扫描接口
    void isPortLost(const QStringList& currentPorts, SERIAL* Serial);
    void updateComList(QStringList scanSerialPorts, bool isOpen); // 更新端口列表并发信号


signals:
    void comListChanged(const QStringList& ports); // 端口列表变化
    void serialErrorOccurred(const QString& errorMsg); // 串口打开异常信号
    void serialPortLost(); // 串口丢失异常信号
    void portChanged();  //串口改变

public:
    // ===================== UDP参数设置 =====================
    //设置接口
    Q_INVOKABLE void setRangeIP(const QString& Str);    //设置远程IP
    Q_INVOKABLE void setRangePort(const QString& Str);  //设置远程端口
    Q_INVOKABLE void setLocalPort(const QString& Str);  //设置本地端口

     QString ReadRangeIP();    //设置远程IP
     QString ReadRangePort();  //设置远程端口
     QString ReadLocalPort();  //设置本地端口
};


#endif //CONFIG_H
